package com.controller;

import com.context.conexion.EnahoConexion;
import com.controller.http.SesionEnaho;
import util.controller.Vista;
import com.model.domain.persona.Encuestador;
import com.model.domain.tiempo.Actividad;
import com.model.domain.tiempo.Mes;
import com.model.domain.tiempo.Periodo;
import com.model.domain.tiempo.Quincena;
import com.model.domain.ubicacion.Conglomerado;
import com.model.domain.dinero.ConglomeradoPersonalDetalle;
import com.model.domain.dinero.ConglomeradoPersonalResumen;
import com.model.domain.dinero.Partida;
import com.model.domain.dinero.ReportePeriodo;
import com.model.domain.persona.Personal;
import com.model.domain.ubicacion.Odei;
import com.model.service.ConglomeradoPersonalResumenService;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.StringUtil;

/**
 *
 * @author rdelacruz
 */
public class ConglomeradoPersonalResumenController 
extends AbstractController
{   
    private static final String buscarView="pagweb/rutas/asignacion_partidas.jsp";
    private static final String editarView="pagweb/rutas/asignacion_partidas_detalle.jsp";
    private static final String reporteView="pagweb/rutas/reporte_partidas.jsp";
    
    //PROGRAMACION - PANTALLA 1
    public void verProgramacion(Vista v, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            
            SesionEnaho ses = new SesionEnaho(request);
            Conglomerado filtro = new Conglomerado();
            filtro.setAnho(ses.getAnho());
            request.setAttribute("comando", filtro);
            
            setearCombos(con,request);
            
            ReportePeriodo<ConglomeradoPersonalResumen> rep = new ReportePeriodo<ConglomeradoPersonalResumen>();
            request.setAttribute("rep", rep);
        }
        finally {
            if(con!=null) con.close();
        }
        v.setUrl(buscarView);
    }
    
    private void setearFiltroBusqueda(HttpServletRequest request, Conglomerado filtro) {
        filtro.setAnho(request.getParameter("anho"));
        
        Mes m = new Mes();
        m.setCodigo(request.getParameter("mes"));
        filtro.setMes(m);
        
        Odei od = new Odei();
        od.setCodigo(request.getParameter("odei"));
        filtro.setOdei(od);
        
        Periodo p = new Periodo();
        p.setCodigo(request.getParameter("periodo"));
        filtro.setPeriodo(p);
    }
    
    public void buscarProgramacion(Vista v, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            verBuscarProgramacion(con,v,request,response);
        }
        finally {
            if(con!=null) con.close();
        }
    }
    
    public void verBuscarProgramacion(Connection con,Vista v, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Conglomerado filtro = new Conglomerado();
        setearFiltroBusqueda(request,filtro);
        request.setAttribute("comando",filtro);

        ConglomeradoPersonalResumenService service = (ConglomeradoPersonalResumenService)this.getService();
        setearCombos(con,request);             
        request.setAttribute("rep", service.findReporteResumenProgramacionByFilter(con,filtro));
        
        v.setUrl(buscarView);
    }
    
    private void setearCombos(Connection con, HttpServletRequest request) throws SQLException {
        ConglomeradoPersonalResumenService service = (ConglomeradoPersonalResumenService)this.getService();
        request.setAttribute("anhos", service.getConglomeradoService().findAnhos(con));
        request.setAttribute("meses", service.getMesService().findAll(con));
        request.setAttribute("odeis", service.getOdeiService().findAll(con));
        request.setAttribute("periodos", service.getPeriodoService().findAll(con));
        
        List<Quincena> quincenas = new ArrayList<Quincena>();
        
        Quincena q1 = new Quincena();
        q1.setCodigo("1");
        q1.setNombre("Primera quincena");
        quincenas.add(q1);
        
        Quincena q2 = new Quincena();
        q2.setCodigo("2");
        q2.setNombre("Segunda quincena");
        quincenas.add(q2);
        
        request.setAttribute("quincenas", quincenas);
    }
    
    //****************************************************************************
     
    public void verReporte(Vista v, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            
            SesionEnaho ses = new SesionEnaho(request);
            Conglomerado filtro = new Conglomerado();
            filtro.setAnho(ses.getAnho());
            request.setAttribute("comando",filtro);
            
            setearCombos(con,request);
        }
        finally {
            if(con!=null) con.close();
        }
        v.setUrl(reporteView);
    }
    
    public void buscarReporte(Vista v, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Conglomerado filtro = new Conglomerado();
        filtro.setAnho(request.getParameter("anho"));
        
        Mes m = new Mes();
        m.setCodigo(request.getParameter("mes"));
        filtro.setMes(m);
        
        Odei od = new Odei();
        od.setCodigo(request.getParameter("odei"));
        filtro.setOdei(od);
        
        Periodo p = new Periodo();
        p.setCodigo(request.getParameter("periodo"));
        filtro.setPeriodo(p);
        
        Quincena q = new Quincena();
        q.setCodigo(request.getParameter("quincena"));
        filtro.setQuincena(q);
        
        
        
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            ConglomeradoPersonalResumenService service = (ConglomeradoPersonalResumenService)this.getService();
            setearCombos(con,request);        
            
            Odei odei = service.getOdeiService().findConDepartamentoByCodigo(con, filtro.getOdei().getCodigo());
            if(odei!=null)
                filtro.getOdei().setDepartamento(odei.getDepartamento());
            
            request.setAttribute("rep", service.findReporteAsignacionByFilter(con,filtro));
        }
        finally {
            if(con!=null) con.close();
        }
        
        request.setAttribute("comando",filtro);        
        v.setUrl(reporteView);
    }
    
    private void setearFiltroEditar(HttpServletRequest request, ConglomeradoPersonalResumen filtro) {
        Conglomerado c = new Conglomerado();
        c.setCodigo(request.getParameter("c"));        
        filtro.setConglomerado(c);     
        
        Periodo p = new Periodo();
        p.setCodigo(request.getParameter("pt"));
        filtro.setPeriodoTrabajo(p);
        
        Personal per = new Personal();
        filtro.setPersonal(per); 
        per.setDni(request.getParameter("p")); 

    }
    
    public void nuevo(Vista v, HttpServletRequest request, HttpServletResponse response) throws SQLException, Exception {
        ConglomeradoPersonalResumen filtro = new ConglomeradoPersonalResumen();        
        setearFiltroEditar(request,filtro);
        
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();            
        
            //POR DEFECTO:
            //periodo de trabajo inicial es el periodo del marco
            //filtro.setPeriodoTrabajo(filtro.getConglomerado().getPeriodo());
                        
            //Día de Descanso 
            Actividad a = new Actividad();
            a.setCodigo("02");
            filtro.setActividadDiaLunes(a);           
            
            verEditar(v,con,request,filtro);
        }
        finally {
            if(con!=null) con.close();
        }
        
    }
    
    public void eliminar(Vista v, HttpServletRequest request, HttpServletResponse response) throws Exception {                
        ConglomeradoPersonalResumen filtro = new ConglomeradoPersonalResumen();
        setearFiltroEditar(request,filtro);
                                      
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            con.setAutoCommit(false);
            ConglomeradoPersonalResumenService service = (ConglomeradoPersonalResumenService)this.getService();
            service.eliminar(con,filtro);            
            verBuscarProgramacion(con,v,request,response);
            con.commit();
        }
        catch(Exception ex) {
            if(con!=null) con.rollback();
            throw ex;
        }
        finally {
            if(con!=null) con.close();
        }
    }
    
    public void editar(Vista v, HttpServletRequest request, HttpServletResponse response) throws SQLException, Exception {
        ConglomeradoPersonalResumen filtro = new ConglomeradoPersonalResumen();
        setearFiltroEditar(request,filtro);
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();  
            
            ConglomeradoPersonalResumenService service = (ConglomeradoPersonalResumenService)this.getService();
            ConglomeradoPersonalResumen obj = service.findByFiltro(con,filtro);
            verEditar(v,con,request,obj);
        }
        finally {
            if(con!=null) con.close();
        }
    }
        
    
    //DATOS PARA PROGRAMACION - PANTALLA 2
    private void verEditar(Vista v, Connection con, HttpServletRequest request, ConglomeradoPersonalResumen comando) throws SQLException, ParseException {
        Conglomerado filtroBuscar = new Conglomerado();
        setearFiltroBusqueda(request, filtroBuscar);
        request.setAttribute("filtroBuscar", filtroBuscar);        
        
        ConglomeradoPersonalResumenService service = (ConglomeradoPersonalResumenService)this.getService();
        
        Conglomerado c = service.findConglomeradoParaVistaEditarByCodigo(con, comando.getConglomerado().getCodigo());
        comando.setConglomerado(c);
        
        Periodo p = service.getPeriodoService().findByAnhoMesPeriodo(con, 
                c.getAnho(), c.getMes().getCodigo(), comando.getPeriodoTrabajo().getCodigo());
        comando.setPeriodoTrabajo(p);
        
        //request.setAttribute("conglomerados", service.getConglomeradoService().findByFilter(con,filtro.getConglomerado()));        
        request.setAttribute("periodos", service.getPeriodoService().findAll(con));        
        //request.setAttribute("partidas", service.getPartidaService().findAll(con));        
        request.setAttribute("partidasDiarias", service.getPartidaService().findPartidasDiarias(con,c));        
        
        //request.setAttribute("partidasNoDiarias", service.getPartidaService().findPartidasNoDiarias(con));
        service.setearPartidasNoDiarias(con,comando);        

        List<Actividad> actividades = service.getActividadService().findAll(con);
        request.setAttribute("actividades", actividades);    

        /*
        ConglomeradoPersonalPeriodoReporte rep = service.findReporteDetalleProgramacionByFilter(con, filtro);
        request.setAttribute("rep", rep);
        */
        
        List<Encuestador> encuestadores;
        if(comando.getPersonal()!=null && comando.getPersonal().getDni()!=null) {
            //obtener solo una lista con el personal dado por el dni
            encuestadores = service.getEncuestadorService().findByCodigo_codigoNombreCargoNroEntrevistasAnhoPasado(con,comando.getPersonal().getDni());
        }
        else {
            //obtener una lista con todo el personal menos el personal ya asignado al conglomerado
            encuestadores = service.findPosiblesEncuestadoresActivosExceptoAsignadosAlConglomeradoPeriodoTrabajo_codigoNombreNroEntrevistasAnhoPasado_siTrabajoConglomerado(con
                            ,comando.getConglomerado().getCodigo(),comando.getPeriodoTrabajo().getCodigo()); 
        }
        request.setAttribute("encuestadores", encuestadores);
            
        request.setAttribute("filtro", comando);                
        
        v.setUrl(editarView);
    }
    
    public void guardar(Vista v, HttpServletRequest request, HttpServletResponse response) throws SQLException, Exception {
        
        ConglomeradoPersonalResumen comando = new ConglomeradoPersonalResumen();
        
        Conglomerado c = new Conglomerado();
        comando.setConglomerado(c);
        c.setCodigo(request.getParameter("conglomerado"));
        
        Periodo p = new Periodo();
        p.setCodigo(request.getParameter("periodoTrabajo"));
        comando.setPeriodoTrabajo(p);
        
        Encuestador e = new Encuestador();
        comando.setPersonal(e);
        e.setDni(request.getParameter("encuestador"));
        
        //ACTIVIDADES
        Actividad a;
        
        a = new Actividad();
        a.setCodigo(StringUtil.filtrarVacioONulo(request.getParameter("actividadMar")));
        comando.setActividadDiaMartes(a);
        
        a = new Actividad();
        a.setCodigo(StringUtil.filtrarVacioONulo(request.getParameter("actividadMie")));
        comando.setActividadDiaMiercoles(a);
        
        a = new Actividad();
        a.setCodigo(StringUtil.filtrarVacioONulo(request.getParameter("actividadJue")));
        comando.setActividadDiaJueves(a);
        
        a = new Actividad();
        a.setCodigo(StringUtil.filtrarVacioONulo(request.getParameter("actividadVie")));
        comando.setActividadDiaViernes(a);
        
        a = new Actividad();
        a.setCodigo(StringUtil.filtrarVacioONulo(request.getParameter("actividadSab")));
        comando.setActividadDiaSabado(a);
        
        a = new Actividad();
        a.setCodigo(StringUtil.filtrarVacioONulo(request.getParameter("actividadDom")));
        comando.setActividadDiaDomingo(a);
        
        a = new Actividad();
        a.setCodigo(StringUtil.filtrarVacioONulo(request.getParameter("actividadLun")));
        comando.setActividadDiaLunes(a);
        
        
        //PARTIDA DIARIA        
        ConglomeradoPersonalDetalle cpd;
        Partida pa;
        
        cpd = new ConglomeradoPersonalDetalle();
        pa = new Partida();
        pa.setCodigo(request.getParameter("codigoD"));
        cpd.setPartida(pa);
        cpd.setMontoDiario(Integer.parseInt(request.getParameter("partidaD")));
        cpd.setNroDias(Integer.parseInt(request.getParameter("nroDias")));
        cpd.setConglomeradoPersonalResumen(comando);
        comando.setPartidaDiaria(cpd);
        
        //PARTIDA NO DIARIAS
        String[] codigosND = request.getParameterValues("codigoND");
        String[] partidasND = request.getParameterValues("partidaND");        
        List<ConglomeradoPersonalDetalle> lista = new ArrayList<ConglomeradoPersonalDetalle>();
        for (int i = 0; i < codigosND.length; i++) {
            String valor = partidasND[i].trim();
            if(!valor.isEmpty()) {
                cpd = new ConglomeradoPersonalDetalle();
                pa = new Partida();
                pa.setCodigo(codigosND[i]);
                
                cpd.setPartida(pa);                
                cpd.setMontoDiario(Integer.parseInt(valor));
                cpd.setNroDias(1);
                cpd.setConglomeradoPersonalResumen(comando);
                
                lista.add(cpd);
            }
        }
        comando.setPartidasNoDiarias(lista);
        comando.setObservacion(request.getParameter("observacion"));
                
        //TRANSACCION
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            con.setAutoCommit(false);
            
            ConglomeradoPersonalResumenService service = (ConglomeradoPersonalResumenService)this.getService();
            service.guardar_actualizar(con, comando);  
                       
            //verEditar(v,con,request,comando);
            verBuscarProgramacion(con, v, request, response);
            
            con.commit();
        }
        catch(Exception ex) {
            if(con!=null) con.rollback();
            throw ex;
        }
        finally {
            if(con!=null) con.close();
        }             
    }
    
    
}
